<?php

$pattern = "^[a-zA-Z0-9_. -]+$"; //Est reproduite dans is_alpha_num. Donc y modifier aussi si modif ici.
include($_SERVER["DOCUMENT_ROOT"] . "/menu.php");
include($_SERVER["DOCUMENT_ROOT"] . "/fonctions_mysqli.php");

//Ne renvoie la valeur donnée que si elle est numérique, sinon renvoie 0.
function get_num($num) {
    if (is_numeric($num))
        return $num;
    else
        return 0;
}

//Sécurise une chaîne, en enlevant d'évenutels tags.
function get_data_ss_tag($data) {
    return trim(strip_tags($data));
}

//Sécurise une chaîne, en ne la retournant que si elle n'est qu'alphanumerique
function get_alphanum($data) {
    if (preg_match("#^[a-zA-Z0-9_-]+$#", $data))
        return $data;
    else
        return "";
}

//Vérifie qu'une chaîne est uniquement alphanumérique, ou comportant des underscores, espace ou tirets.
function is_alpha_num($str) {
    if (preg_match("#^[a-zA-Z0-9ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ_\s-]+$#", $str))
        return true;
    else
        return false;
}

//Sécurise une chaîne, en ne la retournant que si elle n'est qu'alphanumerique ou contenant des points
function get_alphanumpoint($data) {
    if (preg_match("#^[a-zA-Z0-9_.]+$#", $data))
        return $data;
    else
        return "";
}

function get_post_get_num($var) {
    $retour = get_num(@$_GET[$var]);
    if ($retour == 0)
        $retour = get_num(@$_POST[$var]);
    return $retour;
}

function get_post_get($var) {
    $retour = get_data_ss_tag(@$_GET[$var]);
    if ($retour == "")
        $retour = get_data_ss_tag(@$_POST[$var]);
    return $retour;
}

/** Vérifie que l'ip actuelle est bien l'ip avec laquelle le type s'est connectée. Sinon, c'est potentiellement un détournement de session.
  Dans le doute, on le déco. */
function test_session_piratee($mysqli) {
    /* Finalement on utilise pas ça pour l'instant. En effet, si ça arrive (à cause d'un pirate ailleurs, ou juste une reco sur un autre wifi)
      alors que le swf de jeu est ouvert, ça peut faire foirer plein de truc du PHWservice. TODO : à repenser si nécessaire.
      if(!empty($_SESSION['login']) && $_SESSION['ip'] != $_SERVER['REMOTE_ADDR'] &&)
      reset_session($mysqli); */
}

function reset_session($mysqli) {
    session_unset();
    session_destroy();
    session_start();
    setcookie("auto", "", time() - 3600, '/', "", false, true);
    setcookie("login2", "", time() - 3600, '/', "", false, true);
    setcookie("motpasse", "", time() - 3600, '/', "", false, true);
    mysqli_query_with_error($mysqli, "DELETE FROM sessions WHERE session_id='" . session_id() . "'");
}

function connect_guy($mysqli, $infos_session) {
    session_regenerate_id(TRUE);
    $_SESSION['login'] = $infos_session['username'];
    $_SESSION['id'] = $infos_session['user_id'];
    $_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
    $_SESSION['lastvisit'] = $infos_session['user_lastvisit'];
    $_SESSION['lang'] = "fr";
    // TODO $_SESSION['lang'] = $infos_session['user_lang'];
    $_SESSION['grad'] = NULL;
}

function how_much_xp($level) {    
    return $level * ($level-1) * 25;
}

//Formate un strotime en chaine jolie. Le second paramètre indique si on veut voir les minutes, et le troisième si on veut voir l'année. 
//Le quatrième précise si les mois doivent s'écrire en abrégé ou en toute lettre.
function datouille($dat, $bool_minute, $bool_annee = true, $mois_entier = false) {
    $dat = get_num($dat);
    $jour = date("d", $dat);
    $mwa = date("m", $dat);
    $date = "Aujourd'hui";
    $date_actu = strtotime("now");
    if ($jour != date("d", $date_actu) || $mwa != date("m", $date_actu) || date("Y", $dat) != date("Y", $date_actu)) {
        $mois = "kebab";
        switch ($mwa) {
            case '01': if ($mois_entier)
                    $mois = "Janvier";
                else
                    $mois = "Jan"; break;
            case '02': if ($mois_entier)
                    $mois = "Février";
                else
                    $mois = "Fev"; break;
            case '03': $mois = "Mars";
                break;
            case '04': $mois = "Avril";
                break;
            case '05': $mois = "Mai";
                break;
            case '06': $mois = "Juin";
                break;
            case '07': if ($mois_entier)
                    $mois = "Juillet";
                else
                    $mois = "Juil"; break;
            case '08': $mois = "Août";
                break;
            case '09': if ($mois_entier)
                    $mois = "Septembre";
                else
                    $mois = "Sept"; break;
            case '10': if ($mois_entier)
                    $mois = "Octobre";
                else
                    $mois = "Oct"; break;
            case '11': if ($mois_entier)
                    $mois = "Novembre";
                else
                    $mois = "Nov"; break;
            case '12': if ($mois_entier)
                    $mois = "Décembre";
                else
                    $mois = "Déc"; break;
        }
        $annee = "";
        if ($bool_annee)
            $annee = " " . date("Y", $dat);
        $date = "le " . $jour . " " . $mois . $annee;
    }

    if ($bool_minute) {
        $heure = date("H", $dat);
        $minute = date("i", $dat);
        $date = $date . " à " . $heure . "h" . $minute;
    }
    return $date;
}

//Formate un strotime en chaine de type JJ/MM/AA. bool_minute indique si on veut voir les minutes.
function datouille_slash($dat, $bool_minute = false) {
    $dat = get_num($dat);
    $jour = date("d", $dat);
    $mois = date("m", $dat);
    $annee = date("y", $dat);
    $retour = $jour . "/" . $mois . "/" . $annee;
    if ($bool_minute) {
        $heure = date("H", $dat);
        $minute = date("i", $dat);
        $retour = $retour . " à " . $heure . "h " . $minute;
    }
    return $retour;
}

function get_page($page_max) {
    $page = get_post_get("page");
    if ($page == 0)
        $page = 1;
    if ($page == 'd')
        $page = $page_max;
    return get_num($page);
}

//Affiche le formulaire de changement de page et retourne un objet $data_pages qui servira à choisir les données à afficher 
//(en fonction de la page courante) et les liens de changement de page en bas.
function pagination($nbparpage, $nbresult, $adresse) {
    if ($nbresult == 0)
        $nbresult = 1;
    $data_pages = array();
    $data_pages['adresse'] = $adresse;
    $data_pages['nbpages'] = ceil($nbresult / $nbparpage);
    $data_pages['page'] = get_page($data_pages['nbpages']);
    if ($data_pages['page'] > $data_pages['nbpages'])
        return NULL;
    $data_pages['nbmin'] = ($data_pages['page'] - 1) * $nbparpage;
    $data_pages['nbmax'] = $data_pages['nbmin'] + $nbparpage;
    if ($data_pages['nbpages'] > 1) {
        echo "<div style='float: right;'><form action='$adresse' 
		 method='POST'>Aller à la page <select name='page'>";
        for ($i = 1; $i <= $data_pages['nbpages']; $i++) {
            $sel = "";
            if ($i == $data_pages['page'])
                $sel = "selected";
            echo "<option value='$i' $sel>$i";
        }
        echo "</select><input type='submit' value='Go'></form></div>";
    }
    return $data_pages;
}

/**
 * Affiche la pagination à l'endroit où cette fonction est appelée
 * @param string $url L'URL ou nom de la page appelant la fonction, ex: 'index.php' ou 'http://example.com/'
 * @param string $link La nom du paramètre pour la page affichée dans l'URL, ex: '?page=' ou '?&p='
 * @param int $total Le nombre total de pages
 * @param int $current Le numéro de la page courante
 * @param int $adj (facultatif) Le nombre de pages affichées de chaque côté de la page courante (défaut : 1)
 * @return La chaîne de caractères permettant d'afficher la pagination
 */
function pagination_bas($url, $link, $total, $current, $adj = 1) {

    // Initialisation des variables
    $prev = $current - 1; // numéro de la page précédente
    $next = $current + 1; // numéro de la page suivante
    $penultimate = $total - 1; // numéro de l'avant-dernière page
    $pagination = ''; // variable retour de la fonction : vide tant qu'il n'y a pas au moins 2 pages

    if ($total > 1) {
        // Remplissage de la chaîne de caractères à retourner
        echo '<div id="pagination">
		<ul>';

        /* =================================
         *  Affichage du bouton [précédent]
         * ================================= */
        if ($current == 2) {
            // la page courante est la 2, le bouton renvoie donc sur la page 1, remarquez qu'il est inutile de mettre $url{$link}1
            echo '<li><a href="' . $url . $link . '1" title="Page précédente" class="fleche_gauche"></a></li>';
        } elseif ($current > 2) {
            // la page courante est supérieure à 2, le bouton renvoie sur la page dont le numéro est immédiatement inférieur
            echo '<li><a href="' . $url . $link . $prev . '" title="Page précédente" class="fleche_gauche"></a></li>';
        }

        /**
         * Début affichage des pages, l'exemple reprend le cas de 3 numéros de pages adjacents (par défaut) de chaque côté du numéro courant
         * - CAS 1 : il y a au plus 5 pages, insuffisant pour faire une troncature
         * - CAS 2 : il y a au moins 6 pages, on effectue la troncature pour afficher 11 numéros de pages au total
         */
        /* ===============================================
         *  CAS 1 : au plus 5 pages -> pas de troncature
         * =============================================== */
        if ($total < 4 + ($adj * 2)) {
            // Ajout de la page 1 : on la traite en dehors de la boucle pour n'avoir que index.php au lieu de index.php?p=1 et ainsi éviter le duplicate content
            echo ($current == 1) ? '<li><a href="' . $url . $link . '1" class="num active ombre">1</a></li>' : '<li><a href="' . $url . $link . '1" class="num ombre">1</a>'; // Opérateur ternaire : (condition) ? 'valeur si vrai' : 'valeur si fausse'
            // Pour les pages restantes on utilise itère
            for ($i = 2; $i <= $total; $i++) {
                if ($i == $current) {
                    // Le numéro de la page courante est mis en évidence (cf. CSS)
                    echo '<li><a href="' . $url . $link . $i . '" class="num active ombre">' . $i . '</a></li>';
                } else {
                    // Les autres sont affichées normalement
                    echo '<li><a href="' . $url . $link . $i . '" class="num ombre">' . $i . '</a></li>';
                }
            }
        }
        /* =========================================
         *  CAS 2 : au moins 13 pages -> troncature
         * ========================================= */ else {
            /**
             * Troncature 1 : on se situe dans la partie proche des premières pages, on tronque donc la fin de la pagination.
             * l'affichage sera de neuf numéros de pages à gauche ... deux à droite
             * 1 2 3 4 5 6 7 8 9 … 16 17
             */
            if ($current < 1 + ($adj * 2)) {
                // Affichage du numéro de page 1
                echo ($current == 1) ? '<li><a href="' . $url . $link . '1" class="num active ombre">1</a></li>' : '<li><a href="' . $url . $link . '1" class="num ombre">1</a>'; // Opérateur ternaire : (condition) ? 'valeur si vrai' : 'valeur si fausse'
                // puis des $adj autres suivants
                for ($i = 2; $i < 2 + $adj; $i++) {
                    if ($i == $current) {
                        echo '<li><a href="' . $url . $link . $i . '" class="num active ombre">' . $i . '</a></li>';
                    } else {
                        echo '<li><a href="' . $url . $link . $i . '" class="num ombre">' . $i . '</a></li>';
                    }
                }

                // ... pour marquer la troncature
                echo '<li class="suspension">...</li>';

                // et enfin le dernier numéro
                echo '<li><a href="' . $url . $link . $total . '" class="num ombre">' . $total . '</a></li>';
            }
            /**
             * Troncature 2 : on se situe dans la partie centrale de notre pagination, on tronque donc le début et la fin de la pagination.
             * l'affichage sera deux numéros de pages à gauche ... sept au centre ... deux à droite
             * 1 2 … 5 6 7 8 9 10 11 … 16 17
             */ elseif ((($adj * 2) + 1 < $current) && ($current < $total - ($adj * 2))) {
                // Affichage des numéros 1
                echo '<li><a href="' . $url . $link . '1" class="num ombre">1</a>';
                echo '<li class="suspension">...</li>';

                // les pages du milieu : les trois précédant la page courante, la page courante, puis les trois lui succédant
                for ($i = $current - $adj; $i <= $current + $adj; $i++) {
                    if ($i == $current) {
                        echo '<li><a href="' . $url . $link . $i . '" class="num active ombre">' . $i . '</a></li>';
                    } else {
                        echo '<li><a href="' . $url . $link . $i . '" class="num ombre">' . $i . '</a></li>';
                    }
                }

                echo '<li class="suspension">...</li>';

                // et enfin le dernier numéro
                echo '<li><a href="' . $url . $link . $total . '" class="num ombre">' . $total . '</a></li>';
            }
            /**
             * Troncature 3 : on se situe dans la partie de droite, on tronque donc le début de la pagination.
             * l'affichage sera deux numéros de pages à gauche ... neuf à droite
             * 1 2 … 9 10 11 12 13 14 15 16 17
             */ else {
                // Affichage des numéros 1 et 2
                echo '<li><a href="' . $url . $link . '1" class="num ombre">1</a>';
                echo '<li class="suspension">...</li>';

                // puis des neuf derniers numéros
                for ($i = $total - ($adj); $i <= $total; $i++) {
                    if ($i == $current) {
                        echo '<li><a href="' . $url . $link . $i . '" class="num active ombre">' . $i . '</a></li>';
                    } else {
                        echo '<li><a href="' . $url . $link . $i . '" class="num ombre">' . $i . '</a></li>';
                    }
                }
            }
        }
        /* ===============================
         *  Affichage du bouton [suivant]
         * =============================== */
        if ($current != $total) {
            echo '<li><a href="' . $url . $link . ($current + 1) . '" title="Page suivante" class="fleche_droite"></a></li>';
        }

        // Fermeture de la <div> d'affichage
        echo "</div>";
    }
}

function get_avatar($nom_fichier, $id_color, $id_avatar = "",$lien="", $width=118, $css=" margin-left:2px;") {
    if ($id_avatar != "") {
        $id = 'id="' . $id_avatar . '"';
    } else {
        $id = "";
    }
    if ($lien==""){
        $lien="../jeu/avatars/";
    }
    return "<img " . $id . " src='".$lien.$nom_fichier."' style='background:" . get_color($id_color) . "; width:".$width."px;".$css."'>";
}

function get_color($id_color) { //return noir si problème.
    if (file_exists($_SERVER["DOCUMENT_ROOT"] . '/jeu/bibli/db/couleurs.xml')) {
        $xml = simplexml_load_file($_SERVER["DOCUMENT_ROOT"] . '/jeu/bibli/db/couleurs.xml');
        foreach ($xml->color as $color)
            if ($color['id'] == $id_color)
                return "#" . substr($color['hexa'], 2);
    } return "#000000";
}

/** Transforme le nom usuel d'une faction en son vrai nom. Par ex, "rpatch" devient "R-PATCH".*/
function get_faction($nom_usuel) {
    $faction = "";
    switch ($nom_usuel) {
        case 'wraak': $faction = "Wraak";
            break;
        case 'rpatch': $faction = "R-PATCH";
            break;
        case 'anthropiste': $faction = "Anthropiste";
            break;
    }
    return $faction;
}

function EnvoyerMail($sujet, $message, $destinataire, $expediteur, $BCC = "", $PJ = "") {
    require_once($_SERVER['DOCUMENT_ROOT'].'/lib/PHPMailer-master/class.phpmailer.php');
    $mail = new PHPMailer();
    if ($expediteur != "") {
        $mail->setFrom($expediteur, "");
    } else {
        $mail->From = "ne-pas-repondre@catel.pro"; //TODO : attention, c'est pas une adresse PHW ça :p
        $mail->FromName = "NE PAS REPONDRE";
    }
    $mail->Subject = $sujet;
    $mail->CharSet = 'UTF-8';
    $mail->MsgHTML($message);
    $mail->AltBody = "Ce message est au format HTML, votre messagerie n'accepte pas ce format.";
    $mail->addBCC($BCC);
    $mail->isHTML(true);
    
    $destinataire_array = explode(";", $destinataire);
    foreach ($destinataire_array as $d) {
        $mail->AddAddress($d);
    }

    $fichiers = explode(';', $PJ);
    foreach ($fichiers as $f) {

        if ($f != "" && file_exists($f)) {

            $mail->AddAttachment($f);
        }
    }
    return $mail->send();
}

function genererMDP ($longueur = 8){
    // initialiser la variable $mdp
    $mdp = "";
 
    // Définir tout les caractères possibles dans le mot de passe, 
    // Il est possible de rajouter des voyelles ou bien des caractères spéciaux
    $possible = "2346789bcdfghjkmnpqrtvwxyzBCDFGHJKLMNPQRTVWXYZ";
 
    // obtenir le nombre de caractères dans la chaîne précédente
    // cette valeur sera utilisé plus tard
    $longueurMax = strlen($possible);
 
    if ($longueur > $longueurMax) {
        $longueur = $longueurMax;
    }
 
    // initialiser le compteur
    $i = 0;
 
    // ajouter un caractère aléatoire à $mdp jusqu'à ce que $longueur soit atteint
    while ($i < $longueur) {
        // prendre un caractère aléatoire
        $caractere = substr($possible, mt_rand(0, $longueurMax-1), 1);
 
        // vérifier si le caractère est déjà utilisé dans $mdp
        if (!strstr($mdp, $caractere)) {
            // Si non, ajouter le caractère à $mdp et augmenter le compteur
            $mdp .= $caractere;
            $i++;
        }
    }
 
    // retourner le résultat final
    return $mdp;
}